// 策略模式
package main

import "fmt"

// 武器策略（抽象的策略）
type WeaponStrategy interface {
	UseWeapon() // 使用武器
}

// 具体的策略
type Ak47 struct{}

func (ak *Ak47) UseWeapon() {
	fmt.Println("使用Ak47去战斗")
}

type Knife struct{}

func (k *Knife) UseWeapon() {
	fmt.Println("使用匕首去战斗")
}

// 环境类
type Hero struct {
	strategy WeaponStrategy
}

// 设置一个策略的方法
func (h *Hero) SetWeaponStrategy(s WeaponStrategy) {
	h.strategy = s
}

// 战斗方法（业务）
func (h *Hero) Fight() {
	h.strategy.UseWeapon()
}

func main() {
	hero := &Hero{}

	// 更换策略1
	hero.SetWeaponStrategy(&Ak47{})
	hero.Fight()

	// 更换策略2
	hero.SetWeaponStrategy(&Knife{})
	hero.Fight()
}
